const router = require('koa-router')()
router.prefix('/api/user')
const AppRes = require('../config/app.res')
const AppConfig = require('../config/app.config')
const { register, findByNameAndPwd, resetPwd, updateImg, pwdIseq, findAll, update, deleteById, findOneById, add, findUserMenu } = require('../service/user')
const fs = require('fs')
const path = require('path')
const jwt = require('jsonwebtoken')


// 注册（注册用户后自动登录）
// 注册之前还要判断用户名是否已经存在（存在不允许注册、不存在注册新建用户）
router.post('/register', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['ADD_SUCCESS'],
      data: await register(ctx.request.body)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 登录（获取表单数据，判断用户名和密码是否存在并正确，正确生成token返回给前端）
// 用户名 失去焦点后根据用户名查询 - 判断用户名是否存在
// 密码 
router.post('/login', async (ctx, next) => {
  try {
    let tbody = ctx.request.body
    const user = await findByNameAndPwd(tbody)
    if (user === null) {
      ctx.body = {
        code: 500,
        msg: '密码错误！'
      }
    } else {
      ctx.body = {
        code: 200,
        msg: AppRes['LOGIN_SUCCESS'],
        data: user.id,
        token: jwt.sign({
          data: user.id
        }, AppConfig['secret'], { expiresIn: '1 days' })
      }
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 重置密码
router.post('/resetPwd', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['UPDATE_SUCCESS'],
      data: await resetPwd(ctx.request.body)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 验证输入旧密码与数据库旧密码是否相等
router.post('/pwdIseq', async (ctx, next) => {
  try {
    const user = await findOneById(ctx.request.body.id) // 为了获取数据库旧密码
    ctx.body = {
      code: 200,
      msg: AppRes['GET_SUCCESS'],
      data: await pwdIseq(user.password, ctx.request.body.oldpwd) // 验证输入旧密码与数据库旧密码是否相等
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 修改头像参考若依个人中心的修改头像样式
// 修改用户头像
router.post('/updateImg', async (ctx, next) => {
  try {
    // ctx.request.files.file中的 file 是 name 的名称, <input type="file" name="file"/>
    // console.log(ctx.request.body) // 传入的其他参数，如 id
    // 上传单个文件
    const file = ctx.request.files.file // 获取上传文件
    // 判断后缀名
    const extName = file.name.substring(file.name.lastIndexOf('.'), file.name.length)
    if (extName != '.jpg' && extName != '.png') {
      ctx.body = {
        code: 400,
        msg: `不支持上传后缀名为${extName}的文件`
      }
    }
    ctx.body = {
      code: 200,
      msg: AppRes['UPDATE_SUCCESS'],
      data: await updateImg(ctx.origin, file, ctx.uid)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 查询
router.get('/list', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['GET_SUCCESS'],
      data: await findAll(ctx.query) // 获取 query 参数
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 修改
router.put('/update', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['UPDATE_SUCCESS'],
      data: await update(ctx.request.body)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 删除
router.delete('/deleteById/:id', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['DELETE_SUCCESS'],
      data: await deleteById(ctx.params.id)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 根据id查询
router.get('/detail/:id', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['GET_SUCCESS'],
      data: await findOneById(ctx.params.id)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 根据用户名查询(查询是否被使用)
router.get('/findByName/:username', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['GET_SUCCESS'],
      data: await findByName(ctx.params.username)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 新增用户
router.post('/add', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['ADD_SUCCESS'],
      data: await add(ctx.request.body)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

// 用户下菜单
router.get('/getMenu/:id', async (ctx, next) => {
  try {
    ctx.body = {
      code: 200,
      msg: AppRes['GET_SUCCESS'],
      data: await findUserMenu(ctx.params.id)
    }
  } catch (error) {
    error.status = error.status ? error.status : 500
    ctx.throw(error.status, error)
  }
})

module.exports = router